package org.sky.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class FtpUtil {
	/**
     * 从上传文件到FTP服务器
     * @param url  FTP地址        
     * @param port FTP端口
     * @param username 用户名
     * @param password 密码
     * @param remotePath FTP服务器上的相对路径
     * @param fileName 本地待上传的文件名
     * @param localPath 本地文件的路径
     * @param uploadFileName 上传后的文件名
     * @return
     * @throws IOException 
     */
	public static boolean uploadFile(String url, int port, String username,
			String password, String remotePath, String fileName,
			String localPath ,String uploadFileName) throws Exception {
		boolean success = false;
		FTPClient ftpClient = new FTPClient();
        FileInputStream fis = null;

        try {
        	int reply;  
            ftpClient.connect(url,port);
            ftpClient.login(username, password);

            File srcFile = new File(localPath+"/"+fileName);
            fis = new FileInputStream(srcFile);
            reply = ftpClient.getReplyCode();  
            if (!FTPReply.isPositiveCompletion(reply)) {  
            	ftpClient.disconnect();  
                return success;  
            }  
            
            //设置上传目录
            ftpClient.changeWorkingDirectory(remotePath);
            ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("GBK");
            //设置文件类型（二进制）
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            
            //存入FTP时的文件格式  上传时的文件名
            boolean flag = ftpClient.storeFile(uploadFileName, fis);
            if(flag == false){
            	throw new Exception("FTP上传文件失败");
            }
            ftpClient.logout();  
            success = true;  
            
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("FTP上传文件客户端出错！", e);
        } finally {
        	if(fis!= null){
        		fis.close();
        	}
        	
        	if (ftpClient.isConnected()) ftpClient.disconnect();	
        }
        
        return  success;
		
		
	}
	
	
    /**
     * 从FTP下载文件
     * @param url  FTP地址        
     * @param port FTP端口
     * @param username 用户名
     * @param password 密码
     * @param remotePath FTP服务器上的相对路径
     * @param fileName 要下载的文件名
     * @param localPath 下载后保存到本地的路径
     * @return
     * @throws IOException 
     */
	public static void downFile(String url, int port, String username,
			String password, String remotePath, String fileName,
			String localPath) throws IOException {
		boolean success = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			// 如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.connect(url, port);
			ftp.login(username, password);
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
			}
			ftp.enterLocalPassiveMode(); // 设置被动模式，不设置此项会导致下面的listFiles()方法获取不到文件列表
//			ftp.enterLocalActiveMode(); //设置主动模式(ftp默认使用的模式)
			ftp.setControlEncoding("GBK");
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			// 转到指定下载目录
			ftp.changeWorkingDirectory(remotePath);
			// 列出该目录下所有文件
			FTPFile[] fs = ftp.listFiles();
			// 遍历所有文件，找到指定的文件
			for (FTPFile ff : fs) {
				if (ff.getName().equals(fileName)) {
					// 根据绝对路径初始化文件
					File localFile = new File(localPath + "/" + ff.getName());
					// 输出流
					OutputStream is = new FileOutputStream(localFile);
					// 下载文件
					ftp.retrieveFile(ff.getName(), is);
					is.close();
				}
			}
			ftp.logout();
			success = true;
		}catch(Exception e){
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) ftp.disconnect();							
		}
	}
	
	public static void main(String[] args) throws Exception{
		String url="118.193.154.219";
		int port=21;
		String username="wssaidong";
		String password="qeq575";
		String remotePath="/logs";

		String fileName="access.20141229.log";
		String localPath="D:/log";
		FtpUtil.downFile(url, port, username, password, remotePath, fileName, localPath);
	}

}
